package com.xbongbong.saas.service;

import com.xbongbong.paas.domain.entity.PaasFormDataEntity;
import com.xbongbong.paas.domain.entity.PaasFormExplainEntity;
import com.xbongbong.paas.domain.entity.ext.PaasFormDataEntityExt;
import com.xbongbong.paas.field.FieldAttrEntity;
import com.xbongbong.paas.pojo.dto.FormDataListDTO;
import com.xbongbong.paas.pojo.vo.PaasFormDataEsListVO;
import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.pro.customerstatement.pojo.StatementTableDataExportPojo;
import com.xbongbong.pro.customerstatement.pojo.StatementTableDataPojo;
import com.xbongbong.pro.customerstatement.pojo.dto.StatementCustomerListDTO;
import com.xbongbong.pro.customerstatement.pojo.dto.StatementCustomerSummaryDTO;
import com.xbongbong.pro.customerstatement.pojo.dto.StatementCustomerTableDTO;
import com.xbongbong.pro.customerstatement.pojo.dto.StatementCustomerTotalDTO;
import com.xbongbong.pro.customerstatement.pojo.vo.StatementCustomerListVO;
import com.xbongbong.pro.customerstatement.pojo.vo.StatementCustomerSummaryVO;
import com.xbongbong.pro.customerstatement.pojo.vo.StatementCustomerTableVO;
import com.xbongbong.pro.customerstatement.pojo.vo.StatementCustomerTotalVO;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * @author yuqian
 */
public interface CustomerStatementService {


    PaasFormDataEsListVO parentList(FormDataListDTO formDataListDTO) throws XbbException;

    /**
     * 客户对帐单保存
     * 注：
     * 1、如果entityList内的实体del=1，则不生成其对账记录
     * 2、只有回款单、应收款才会生成对账流水
     * 3、回款计划、销项发票、销售出库单/出库发货单（根据应收方式不同）会产生应收，但它们本身不入对账记录
     * @param businessType 回款单、应收款、出库单（一般情况下只有前两种，只有出库产生应收才会传入出库单类型，因为要基于这个判断是否处理产品。但是入对账流水表的BUSINESS_TYPE还是应收款）
     * @param explainMap 表单解释map
     * @param entityList 回款单or应收款list
     * @param distributorMark 经销商标识
     * @return
     * @throws XbbException
     */
    void save(Integer businessType, Map<String, FieldAttrEntity> explainMap, List<? extends PaasFormDataEntityExt> entityList, Integer distributorMark) throws XbbException;

    /**
     * 客户对帐单初始化、增量、修正
     * @param dealWithEs 是否处理es
     * @param businessType 业务类型
     * @param payExplainMap key为corpid_formId；value为explainMap（只有时间字段，如回款时间、预计回款时间，因为插入对账单的对账日期需要用到）
     * @param payDistributorMarkMap key为corpid_formId；value为distributorMark
     * @param statementExplainMap 对账单 key为corpid_distributorMark；value为PaasFormExplainEntity（对账单记录需要存对账单的appId、menuId、formId）
     * @param entityList 回款单or应收款list，并不一定是同一个corpid的数据
     * @throws XbbException
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    void insertBatch4Script(boolean dealWithEs, Integer businessType, Map<String, Map<String, FieldAttrEntity>> payExplainMap, Map<String, Integer> payDistributorMarkMap, Map<String, PaasFormExplainEntity> statementExplainMap, List<? extends PaasFormDataEntityExt> entityList) throws XbbException;

    /**
     * 对账单外层客户id、name列表
     * @param statementCustomerListDTO
     * @return com.xbongbong.pro.customerstatement.pojo.vo.StatementCustomerListVO
     * @throws XbbException
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    StatementCustomerListVO customerIdList(StatementCustomerListDTO statementCustomerListDTO) throws XbbException;

    /**
     * 对账单_内层对账表(单个客户)
     * （1）期初 = (截止至"对账日期"的开始日期所有)应收款总额  - 核销总金额
     * （2）应收余额 = 期初 + 应收款 - 核销金额
     * 注：回款单恒使用【核销金额】参与计算，即预收款的不会参与到期初计算（预收款无核销金额）
     *
     * @param statementCustomerTableDTO
     * @return com.xbongbong.pro.customerstatement.pojo.vo.StatementCustomerTableVO
     * @throws XbbException
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    StatementCustomerTableVO customerTable(StatementCustomerTableDTO statementCustomerTableDTO) throws XbbException;

    /**
     * 对账单_单个客户_合计/剩余
     * @param statementCustomerSummaryDTO
     * @return com.xbongbong.pro.customerstatement.pojo.vo.StatementCustomerSummaryVO
     * @throws XbbException
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    StatementCustomerSummaryVO customerSummary(StatementCustomerSummaryDTO statementCustomerSummaryDTO) throws XbbException;

    /**
     * 对账单_所有客户_应收余额合计
     * @param statementCustomerTotalDTO
     * @return com.xbongbong.pro.customerstatement.pojo.vo.StatementCustomerTotalVO
     * @throws XbbException
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    StatementCustomerTotalVO customerTotal(StatementCustomerTotalDTO statementCustomerTotalDTO) throws XbbException;

    /**
     * 批量删除客户对账单记录
     * @param corpid 公司id
     * @param businessType 业务类型
     * @param sheetIdIn 回/付款单id集合
     * @return java.lang.Integer
     * @throws XbbException
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    Integer deleteBatch(String corpid, Integer businessType, List<Long> sheetIdIn) throws XbbException;

    /**
     * 新增对账记录失败时回滚es--直接删除es数据
     * @param corpid 公司id
     * @param businessType 业务类型
     * @param sheetIdIn 回/付款单id集合
     * @throws XbbException
     * @return java.util.List<com.xbongbong.saas.domain.entity.FundAccountFlowEntity>
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    void addRollback(String corpid, Integer businessType, List<Long> sheetIdIn) throws XbbException;

    /**
     * 更新回滚
     * @param corpid 公司id
     * @param businessType 业务类型
     * @param sheetIdIn 回/付款单id集合
     * @throws XbbException
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    void updateRollback(String corpid, Integer businessType, Collection<Long> sheetIdIn) throws XbbException;

    /**
     * 一致性同步
     * @param corpid 公司ID
     * @param customerId 客户ID
     * @param customerName 客户名称
     * @throws XbbException
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    void dataConsistencyUpdateCustomer(String corpid, Long customerId, String customerName) throws XbbException;
    /**
     * 一致性同步
     * @param corpid 公司ID
     * @param contractId 合同ID
     * @param contractNo 合同编号
     * @throws XbbException
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    void dataConsistencyUpdateContract(String corpid, Long contractId, String contractNo) throws XbbException;

    /**
     * 格式化并封装非期初信息（应收款、回款单）
     * @param corpid
     * @param balanceReceivable 期初应收余额，用于逐条计算各行的应收余额
     * @param entity
     * @param dataList 最终返回的数据list
     * @param snapshot 关联产品是否为快照数据
     * @param paymentIdMap 应收款id 编号Map
     * @param businessType 对账单据的业务类型  为了区分快照数据和对账单主表数据
     * @param statementId 对账单据的id 为了区分快照数据和对账单主表数据
     * @return
     */
    double formatTableData(String corpid, double balanceReceivable, PaasFormDataEntity entity, List<StatementTableDataPojo> dataList, Integer snapshot,Map<Long,String> paymentIdMap,Integer businessType,Long statementId);

    /**
     * 格式化并封装非期初信息（应收款、回款单）
     * @param balanceReceivable 期初应收余额，用于逐条计算各行的应收余额
     * @param entity 对账单实体
     * @param exportDataList 最终返回的数据list
     * @param snapshot 最终返回的数据list
     * @param paymentIdMap 应收款id 编号Map
     * @param businessType 对账单据的业务类型  为了区分快照数据和对账单主表数据
     * @param statementId 对账单据的id 为了区分快照数据和对账单主表数据
     * @return double
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    public double formatTableData4Export(double balanceReceivable, PaasFormDataEntity entity, List<StatementTableDataExportPojo> exportDataList, Integer snapshot,Map<Long,String> paymentIdMap,Integer businessType,Long statementId);
}
